/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package verins.algrtm;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;

/**
 *
 * @author Damn
 */
public class AlgoritmoFirmasH extends Algoritmo{

    public AlgoritmoFirmasH(){

    }

    public AlgoritmoFirmasH(String ruta1, String ruta2){
        this.ruta1 = ruta1;
        this.ruta2 = ruta2;
    }

    public int getVerificacion() throws IOException{
        int[] frmRes;
        frmRes=matchFirmas(ruta1, ruta2);
        return obtenerResultadosCompar(frmRes);
    }

    public int getVerificacion(byte[] bytea, byte[] byteb) throws IOException{
        int[] frmRes;
        frmRes=matchFirmas(bytea, byteb);
        return obtenerResultadosCompar(frmRes);
    }
    
    
    public int[] compararRGBZonas(BufferedImage frmOrig, BufferedImage frmTest){
    int w=0;
    int h=0;

    w=frmOrig.getWidth();
    h=frmOrig.getHeight();

    int [] tRgbFOrig= new int[w*h];
    int [] tRgbFTest= new int[w*h];
    int [] sRGBFOrig=frmOrig.getRGB(0, 0, w, h, tRgbFOrig, 0   ,w);
    int [] sRGBFTest=frmTest.getRGB(0, 0, w, h, tRgbFTest, 0   ,w);

    int [] tRGBResult= new int[w*h];

    //para evitar fuera de bordes
        for (int i=0;i<sRGBFOrig.length;i++){
            if (tRgbFTest[i]==Color.white.getRGB() && tRgbFOrig[i]==Color.white.getRGB())
                tRGBResult[i]=Color.GREEN.getRGB();
            else
            tRGBResult[i]=tRgbFOrig[i]^tRgbFTest[i];
        }

   
    return tRGBResult;
    }


    public int obtenerResultadosCompar(int[] frmOrig){
        int w=0;
        int h=0;
        String respuesta="";
        int nNegro=0;
        int nRojo=0;
        int nAzul=0;
        int nBlanco=0;
        double rateVeracidad=0;
        int verde=0;
        //para evitar fuera de bordes
  
        for (int i=0;i<frmOrig.length;i++){
            if (frmOrig[i]==0){
                nNegro++;
            }else if (frmOrig[i]==16711680){
                nRojo++;
            }else if (frmOrig[i]==255){
                nAzul++;
            }else if (frmOrig[i]==16777215){
                nBlanco++;
            }
        }

        rateVeracidad=((nNegro+0.80*nRojo+0.27*nAzul-0.3*nBlanco/2)/(nRojo+nAzul+nNegro+nBlanco/2))*100;
        String estado="";
        if (rateVeracidad>=70)
            estado="AUTENTICA";
        else
            estado="FALSA";
        //fin
        respuesta+="Coincidentes:  "+nNegro;
        respuesta+="\nCercanos:   "+(nAzul+nRojo);
        //respuesta+="\nErroneos: "+nBlanco;
        respuesta+="\nRate Similitud:  "+ String.format("%0,2f",rateVeracidad);
        respuesta+="\nResultado:  "+ estado;

        System.out.println(respuesta);
        System.out.println("......................");
        return (int)rateVeracidad;

    }
    
    
     public int[]  matchFirmas(String rutaFirma1, String rutaFirma2) throws IOException{
         
            int[] frm1=abrirImagen(rutaFirma1);
            int[] frm2=abrirImagen(rutaFirma2);
            
            //frm2=new ImMatr().dilate(frm2, 100,  1);
            BufferedImage bfIfrm1=pintarZonas( frm1, 100, 1);
            BufferedImage bfIfrm2=pintarZonas( frm2, 100, 2);
            int[] frmRes=compararRGBZonas(bfIfrm1, bfIfrm2);
        
            return frmRes;
    }


    public int[]  matchFirmas(byte[] bytea, byte[] byteb) throws IOException{

            int[] frm1=abrirImagen(bytea);
            int[] frm2=abrirImagen(byteb);

            //frm2=new ImMatr().dilate(frm2, 100,  1);
            BufferedImage bfIfrm1=pintarZonas( frm1, 100, 1);
            BufferedImage bfIfrm2=pintarZonas( frm2, 100, 2);
            int[] frmRes=compararRGBZonas(bfIfrm1, bfIfrm2);

            return frmRes;
    }
     
      



    public BufferedImage pintarZonas(int[] afrm, int ancho,int pos){
        int punto=10+ 205*(pos-1);
        int j=0,k=0;
        BufferedImage bfImg=new BufferedImage(100, 50, BufferedImage.TYPE_INT_RGB);

        Graphics a=bfImg.getGraphics();

         for (int i=0;i<afrm.length;i++){
             a.setColor(Color.white);
             a.drawOval(k, j, 2, 2);
             k++;
            if (i>=ancho && (i %ancho==0)){
                j++;
                k=0;
            }
        }
        j=0;
        k=0;
        if (pos!=2)
         for (int i=0;i<afrm.length;i++){
                 if (afrm[i]==Color.black.getRGB()){
                    a.setColor(Color.blue);
                    a.drawOval(k, j, 8, 8);
                 }
                 k++;
                if (i>=ancho && (i %ancho==0)){
                    j++;
                    k=0;
                }
            }
        j=0;
        k=0;
        if (pos!=2)
         for (int i=0;i<afrm.length;i++){
             if (afrm[i]==Color.black.getRGB()){
                 a.setColor(Color.red);
                 a.drawOval(k+2, j+2, 4, 4);

             }

             k++;
            if (i>=ancho && (i %ancho==0)){
                j++;
                k=0;
            }
        }
        j=0;
        k=0;
        
         for (int i=0;i<afrm.length;i++){
             if (afrm[i]==Color.black.getRGB()){
                a.setColor(Color.black);
                a.drawOval(k+3, j+3, 2, 2);
            }
             k++;

            if (i>=ancho && (i %ancho==0)){
                j++;
                k=0;
            }
        }

        //agranda la imagen
//        BufferedImage bf2= new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
//        Graphics g2=bf2.createGraphics();
//        g2.drawImage(bfImg, 0, 0, 200, 100, null);
          
        return bfImg;
    }

     public BufferedImage abrirMatchFirmaResultado (int[] afrm, int ancho,int pos){
        int punto=10+ 205*(pos-1);
        int j=0,k=0;
        BufferedImage bfImg=new BufferedImage(100, 50, BufferedImage.TYPE_INT_RGB);

        Graphics a=bfImg.getGraphics();
        //a.setColor(Color.white);
         for (int i=0;i<afrm.length;i++){

             if (afrm[i]!=Color.white.getRGB()){
                    a.setColor(new Color(afrm[i]));
                    a.drawOval(k, j, 1, 1);
             }else{
                  a.setColor(Color.white);
                  a.drawOval(k, j, 1, 1);

             }
              //System.out.print(afrm[i]);
              k++;

            if (i>=ancho && (i %ancho==0)){
                j++;
               // a.drawOval(k, j, 15, 15);
               // System.out.print(" \n");
                k=0;
            }
        }

        return bfImg;

    }
     
    
     public int [] abrirImagen(String ruta)throws IOException {
        try{
            BufferedImage bfI=ImageIO.read(new File(ruta));
            int w=bfI.getWidth();
            int h=bfI.getHeight();
            int [] tRgb= new int[w*h];

            int [] sRGB=bfI.getRGB(0, 0, w, h, tRgb, 0   ,w);
            //System.out.println("w: "+w+" - h: "+h);
            //verificar nulos
            dilate(sRGB, w,1);
           // muestraRGB(sRGB,w);
            return sRGB;

        }catch (Exception ex){
            System.out.println("ERr: "+ex.getCause());
        }
       return null;
    }

     public int [] abrirImagen(byte[] bytea)throws IOException {
        try{
            InputStream in = new ByteArrayInputStream(bytea);
            BufferedImage bfI=ImageIO.read(in);
            int w=bfI.getWidth();
            int h=bfI.getHeight();
            int [] tRgb= new int[w*h];

            int [] sRGB=bfI.getRGB(0, 0, w, h, tRgb, 0   ,w);
            //System.out.println("w: "+w+" - h: "+h);
            //verificar nulos
            dilate(sRGB, w,1);
           // muestraRGB(sRGB,w);
            return sRGB;

        }catch (Exception ex){
            System.out.println("ERr: "+ex.getCause());
        }
       return null;
    }
     
     
      public int [] dilate(int [] mRGB,int ancho, int nDilat){
        int fin=mRGB.length;
        int i=0;
        boolean engrosado=false;
        if (nDilat==1){
            while (i<fin){
                engrosado=false;
               // if (i>=ancho && (i % ancho==0)) i++;
                
                if (mRGB[i]<Color.white.getRGB()){//si hay trazo cualquiera
                    mRGB[i]=Color.black.getRGB();
                   // if (mRGB[i+1]==Color.white.getRGB())
                      //  mRGB[i+1]=Color.black.getRGB();//engrosa horizontal
                    //if (mRGB[i+2]==Color.white.getRGB())
                    //    mRGB[i+2]=Color.black.getRGB();
                    //engrosado vertical
                   /* if (i-ancho>=0){
                            mRGB[i-ancho]=Color.black.getRGB();
                            mRGB[i-ancho+1]=Color.black.getRGB();
                            mRGB[i-ancho-1]=Color.black.getRGB();
                    }
*/
                    
                    //engrosado=true;
                }
                i+=1;
               // i+=engrosado?2:1;//para recorrer cada celda de arreglo de pixeles
            }
        }
        if (nDilat==2){//color rojo 255,0,0
            while (i<fin){
                if (mRGB[i]<Color.white.getRGB()){//si hay trazo cualquiera
                    mRGB[i+1]=mRGB[i];//engrosa
                    i++;
                }
                //if (i>=ancho && (i % ancho==0)) i++;borde
                i++;//para recorrer cada celda de arreglo de pixeles
            }
        }
        return mRGB;
    }
      
      
      
/*
    public BufferedImage mostrarFirma (int[] afrm, int ancho,int pos){
        int punto=10+ 205*(pos-1);
        int j=0,k=0;
        BufferedImage bfImg=new BufferedImage(100, 50, BufferedImage.TYPE_INT_RGB);

        Graphics a=bfImg.getGraphics();
        a.setColor(Color.white);
        for (int i=0;i<afrm.length;i++){
             a.setColor(Color.white);
             a.drawOval(k, j, 2, 2);
             k++;
            if (i>=ancho && (i %ancho==0)){
                j++;
                k=0;
            }
        }
        k=0;j=0;
         for (int i=0;i<afrm.length;i++){
             
             if (afrm[i]!=Color.white.getRGB()){
                    a.setColor(new Color(afrm[i]));
                    a.drawOval(k+3, j+3, 1, 1);
             }else{
                  a.setColor(Color.white);
                  a.drawOval(k+3, j+3, 1, 1);
                  
             }
              //System.out.print(afrm[i]);
              k++;
              
            if (i>=ancho && (i %ancho==0)){
                j++;
               // a.drawOval(k, j, 15, 15);
               // System.out.print(" \n");
                k=0;
            }       
        }

        //agranda la imagen
//        BufferedImage bf2= new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
//        Graphics g2=bf2.createGraphics();
//        g2.drawImage(bfImg, 0, 0, 200, 100, null);
//        return bf2;
         return bfImg;
    }
*/
}
